package com.order.manager.service.impl;

import com.alibaba.fastjson2.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.pagehelper.PageInfo;
import com.github.pagehelper.page.PageMethod;
import com.order.manager.Model.ComplaintInfo;
import com.order.manager.service.ComplaintInfoService;
import com.order.manager.mapper.ComplaintInfoMapper;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * 投诉信息管理服务实现类
 * 负责处理投诉信息的增删改查操作，以及与用户信息的关联处理
 *
 * @author 24862
 * @description 针对表【complaint_info】的数据库操作Service实现
 * @createDate 2024-04-08 15:32:07
 */
//标志着我的身份是服务层
@Service
public class ComplaintInfoServiceImpl extends ServiceImpl<ComplaintInfoMapper, ComplaintInfo>
        implements ComplaintInfoService {

    @Resource
    private ComplaintInfoMapper mapper;

    @Resource
    private UserInfoServiceImpl userInfoService;

    /**
     * 分页查询投诉信息列表，并关联用户信息
     *
     * @param page    当前页码，从1开始
     * @param item    每页显示数量
     * @param content 投诉内容关键词，用于模糊查询
     * @return 分页包装的投诉信息列表，每个投诉信息中的userId字段会被替换为用户完整信息的JSON字符串
     *
     * @apiNote 该方法会将投诉信息中的userId替换为用户完整信息的JSON字符串，
     *          便于前端直接使用，避免二次查询用户信息
     *
     * @implNote 实现逻辑：
     *           1. 使用PageHelper进行分页设置
     *           2. 通过MyBatis-Plus的QueryWrapper构建模糊查询条件
     *           3. 查询投诉信息列表
     *           4. 遍历列表，将每个投诉关联的用户ID替换为用户完整信息的JSON字符串
     *           5. 返回分页包装的结果
     */
    @Override
    //PageInfo查询结果分页展示
    public PageInfo<ComplaintInfo> queryList(int page, int item, String content) {
        // 开启分页功能，设置当前页码和每页显示数量
        PageMethod.startPage(page, item);

        // 构建查询条件：对投诉内容进行模糊匹配
        List<ComplaintInfo> complaintInfos = mapper.selectList(
                new QueryWrapper<ComplaintInfo>()
                        // 对应 SQL：WHERE content LIKE '%${content}%'
                        .like("content", content)
        );

        // 将投诉信息中的userId替换为用户完整信息的JSON字符串
        // 注意：这种处理方式会修改原始实体类字段，可能影响其他业务逻辑
        //1.forEach相当于列表中每一个数据都执行以下方法
        //2.el ->调用 的方法有..
        complaintInfos.forEach(el -> {
            // 根据投诉信息中的userId查询用户完整信息
            Object userInfo = userInfoService.getById(el.getUserId());
            // el 调用setUserId将用户信息转换为JSON字符串并设置回投诉信息对象
            el.setUserId(JSON.toJSONString(userInfo));
        });
        // new PageInfo<>(orderForSenders) 会自动：
        //获取当前页数据（orderForSenders）
        //计算总记录数（通过执行 SELECT COUNT(*)）
        //计算总页数、当前页码等信息
        return new PageInfo<>(complaintInfos);
    }
}